/**
 *
 * TacticaXavi.java
 *
 * Created on 7 de febrero de 2007, 22:40
 *
 *   El camp fa:   (-160,-120) -------------------------- (160,-120)
 *     (x,y)                   |           |            |
 *                             |           |            |
 *                 (-160,-30) ||           |            || (160,-30)
 *                            ||           |(0,0)       ||
 *                  (-160,30) ||           |            || (160,30)
 *                             |           |            |
 *                             |           |            |
 *                  (-160,120) -------------------------- (160,120)
 *
 */
package futbol.tacticas.concursantes2007.XAG;

import futbol.tacticas.concursantes.Tactica;

import java.awt.*;
import java.util.Vector;
import futbol.tacticas.*;
import futbol.General;

/**
 *
 * @author xabarca
 */
public class TacticaXAG implements Tactica {

    private int[] arrayValors[];

    private int timer = 0;
    private int timerTOT = 0;

    private boolean plaAlpha = true;


    private int PORTER    = 0;  // jugador #1
    private int LAT_DRET  = 1;  // jugador #2
    private int CENTRAL   = 2;  // jugador #3
    private int LAT_ESQ   = 3;  // jugador #4
    private int MIG_DRET  = 4;  // jugador #5
    private int MIG_ESQ   = 5;  // jugador #6
    private int INT_DRET  = 6;  // jugador #7
    private int INT_ESQ   = 7;  // jugador #8
    private int EXT_DRET  = 10;  // jugador #9
    private int EXT_ESQ   = 9;  // jugador #10
    private int DAVANTER  = 8; // jugador #11

    //
    // valors : (  X , Y , FORA )
    //
    private int[] VALORS_PORTER    =  { -150,  0,   6 };
    private int[] VALORS_LAT_DRET  =  { -110, 50,  5 };
    private int[] VALORS_CENTRAL   =  { -110,   0,  6 };
    private int[] VALORS_LAT_ESQ   =  { -110, -50,  5 };

    private int[] VALORS_MIG_DRET  =  { -90,   30,  8 };
    private int[] VALORS_MIG_ESQ   =  { -90,  -30,  8 };
    private int[] VALORS_INT_DRET  =  { -40,   60,  6 };
    private int[] VALORS_INT_ESQ   =  { -40,  -60,  7 };

    private int[] VALORS_DAVANTER  =  { 100,   10,  6 };
    private int[] VALORS_EXT_DRET  =  { 110,   70,  6 };
    private int[] VALORS_EXT_ESQ   =  { 110,  -100,  6 };


    public TacticaXAG() {
        inici();
    }

    private void inici() {
        arrayValors = new int[11][3];

        if ( plaAlpha ) {
            arrayValors[PORTER]   =  VALORS_PORTER;
            arrayValors[LAT_DRET] =  VALORS_LAT_DRET;
            arrayValors[CENTRAL]  =  VALORS_CENTRAL;
            arrayValors[LAT_ESQ]  =  VALORS_LAT_ESQ;
            arrayValors[MIG_DRET] =  VALORS_MIG_DRET;
            arrayValors[MIG_ESQ]  =  VALORS_MIG_ESQ;
            arrayValors[INT_DRET] =  VALORS_INT_DRET;
            arrayValors[INT_ESQ]  =  VALORS_INT_ESQ;
            arrayValors[DAVANTER] =  VALORS_DAVANTER;
            arrayValors[EXT_DRET] =  VALORS_EXT_DRET;
            arrayValors[EXT_ESQ]  =  VALORS_EXT_ESQ;
        }else{
            int[] VALORS_DAVANTER_NON_APHA   =  { 80 , -20, 9 };
            int[] VALORS_EXT_ESQ_NON_APHA    =  { 110 , -80, 5 };

            arrayValors[PORTER]   =  VALORS_PORTER;
            arrayValors[LAT_DRET] =  VALORS_LAT_DRET;
            arrayValors[CENTRAL]  =  VALORS_CENTRAL;
            arrayValors[LAT_ESQ]  =  VALORS_LAT_ESQ;
            arrayValors[MIG_DRET] =  VALORS_MIG_DRET;
            arrayValors[MIG_ESQ]  =  VALORS_MIG_ESQ;
            arrayValors[INT_DRET] =  VALORS_INT_DRET;
            arrayValors[INT_ESQ]  =  VALORS_INT_ESQ;
            arrayValors[DAVANTER] =  VALORS_DAVANTER_NON_APHA;
            arrayValors[EXT_DRET] =  VALORS_EXT_DRET;
            arrayValors[EXT_ESQ]  =  VALORS_EXT_ESQ_NON_APHA;
        }
    }


    // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - //
    // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - //
    // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - //
    // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - //


    public Color getColor1() {
        return Color.gray;
    }

    public Color getColor2() {
        return Color.gray;
    }

    public Color getColorNumero() {
        return Color.black;
    }

    public String getNombre() {
        return "XAG";
    }

    public int getXInicial(int n) {
        return arrayValors[n][0];
    }

    public int getYInicial(int n) {
        return arrayValors[n][1];
    }

    public int getFuerza(int n) {
        return arrayValors[n][2];
    }

    public Vector<Comando> getComandos(SituacionJugadores sj) {
        Vector<Comando> com=new Vector<Comando>();

        this.timer++;
        this.timerTOT++;

        // accions generals
        accionsGenerals( sj, com );

        // defensa ...
        defensa( sj, com );

        // ataquem ...
        atac( sj, com );

        return com;
    }


    //-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//
    //--//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-
    //-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//


    //
    // Accions - posicionaments defensius
    //
    private void accionsGenerals( SituacionJugadores sj, Vector<Comando> com ) {
        // Posicionamientos
        for ( int n=1;n<11;n++ ) {
            com.add(new ComandoIrA(n, arrayValors[n][0], arrayValors[n][1]));
        }

        //Movimiento mas cercano a la bola
        int nJug = sj.getMasCercanoDeBola();
        Point bola=sj.getBola();
        if ( nJug != PORTER ) {
            com.add( new ComandoIrA( nJug, bola.getX(), bola.getY() ) );
        }

        // diem si estem en un gol nou o no
        Point jugadores[] = sj.getMisJugadores();
        if ( jugadores[DAVANTER].getX() < 0 ){
            this.timer = 0;
        }

        porter ( sj, com );
    }

    //
    // Porter ...
    //
    private void porter(SituacionJugadores sj, Vector<Comando> com) {
        Point bola = sj.getBola();
        int x = arrayValors[PORTER][0];
        int y = (int)(bola.getY());
        //int y=(int)( bola.getY() );
        if (y<-23) y=-23;
        if (y>23) y=23;
        if( (int)(bola.getX()) < -140 && ( (int)(bola.getY())<30 && (int)(bola.getY())>-30 ) ) {
            x = (int)(bola.getX());
        }
        com.add(new ComandoIrA(PORTER, x, y));
    }


    //
    // Accions - posicionaments defensius
    //
    private void defensa(SituacionJugadores sj, Vector<Comando> com) {
        Point bola=sj.getBola();
        Point jugadores[] = sj.getMisJugadores();
        Point contrarios[] = sj.getContrario();
        int distancia = 0;

        //Mejorar defensa
        if ( !sj.estoyMasCercaDeBola() || bola.getX()<0 ){
            // LATERAL DRET
            int rivalLatDret = sj.getContrarioMasCerca(getXInicial(LAT_DRET), getYInicial(LAT_DRET));
            distancia = (int)(General.getDistancia(arrayValors[LAT_DRET][0],arrayValors[LAT_DRET][1],jugadores[LAT_DRET].getX(), jugadores[LAT_DRET].getY()));
            if ( distancia < 40 ) {
                com.add(new ComandoIrA(LAT_DRET, contrarios[rivalLatDret].getX()-5, contrarios[rivalLatDret].getY()));
            }
            // LATERAL ESQ
            int rivalLatEsq = sj.getContrarioMasCerca(getXInicial(LAT_ESQ), getYInicial(LAT_ESQ));
            distancia = (int)(General.getDistancia(arrayValors[LAT_ESQ][0],arrayValors[LAT_ESQ][1],jugadores[LAT_ESQ].getX(), jugadores[LAT_ESQ].getY()));
            if ( distancia < 40 ) {
                com.add(new ComandoIrA(LAT_ESQ, contrarios[rivalLatEsq].getX()-5, contrarios[rivalLatEsq].getY()));
            }
            // CENTRAL
            int rivalCentral = sj.getContrarioMasCerca(getXInicial(CENTRAL), getYInicial(CENTRAL));
            distancia = (int)(General.getDistancia(arrayValors[CENTRAL][0],arrayValors[CENTRAL][1],jugadores[CENTRAL].getX(), jugadores[CENTRAL].getY()));
            if ( distancia < 40 ) {
                com.add(new ComandoIrA(CENTRAL, contrarios[rivalCentral].getX()-5, contrarios[rivalCentral].getY()));
            }

/*            for (int n=1;n<4;n++){
                int nJC=sj.getContrarioMasCerca(getXInicial(n), getYInicial(n));
                com.add(new ComandoIrA(n, contrarios[nJC].getX()+10, contrarios[nJC].getY()));
            }*/
        }
    }


    //
    // Passades i rematades: accions d'atac
    //
    private void atac(SituacionJugadores sj, Vector<Comando> com) {
        // Passades i rematades ...
        Point jugadores[] = sj.getMisJugadores();

        // canviem el pla de joc
        if ( timer == 150 ) {
            plaAlpha = !plaAlpha;
            inici();
        }

        // porter...
        if ( jugadores[LAT_ESQ].getY() < 0 ) {
            com.add ( new ComandoPase ( PORTER, INT_DRET ) );
        }else{
            com.add ( new ComandoPase ( PORTER, INT_ESQ ) );
        }

        // defenses i migcentres defensius ...
        com.add ( new ComandoPase ( LAT_DRET, INT_DRET ) );
        com.add ( new ComandoPase ( LAT_ESQ, INT_ESQ ) );
        com.add ( new ComandoPase ( CENTRAL, INT_DRET ) );
        com.add ( new ComandoPase ( MIG_DRET, EXT_DRET ) );
        com.add ( new ComandoPase ( MIG_ESQ, EXT_ESQ ) );

        // interiors ...
        com.add ( new ComandoPase ( INT_DRET, EXT_DRET ) );
        if ( plaAlpha ) {
           com.add ( new ComandoPase ( INT_ESQ, EXT_ESQ ) );
        }else{
           com.add ( new ComandoPase ( INT_ESQ, EXT_DRET ) );
        }

        //extrems ...
        if ( plaAlpha ) {
            com.add ( new ComandoPase ( EXT_ESQ, DAVANTER ) );
        }else{
            com.add ( new ComandoTiroAPuerta(EXT_ESQ,20) );
        }
        if ( jugadores[EXT_DRET].getX() < 106 && jugadores[EXT_DRET].getY() < 77 ) {
            com.add ( new ComandoGolpearBola(EXT_DRET,160,-28));
        }else if ( jugadores[EXT_DRET].getY() > 95 ) {
            if ( plaAlpha )
                com.add ( new ComandoPase ( EXT_DRET, DAVANTER ) );
            else
                com.add ( new ComandoPase ( EXT_DRET, INT_DRET ) );
        }else{
            com.add ( new ComandoTiroAPuerta(EXT_DRET,-15));
        }

        // davanter ...
        if ( jugadores[LAT_ESQ].getX() < 102 ) {
            if ( jugadores[DAVANTER].getY() < 5 ) {
                //arrayValors[DAVANTER][2] = 9;
                com.add ( new ComandoTiroAPuerta(DAVANTER, -15) );
            }else{
                //arrayValors[DAVANTER][2] = 9;
                com.add ( new ComandoTiroAPuerta(DAVANTER, +5) );
            }
        }else{
            if ( plaAlpha ) {
                if ( jugadores[DAVANTER].getY() < 0 ) {
                    //arrayValors[DAVANTER][2] = 9;
                    com.add ( new ComandoPase ( DAVANTER, EXT_DRET ) );
                }else{
                    //arrayValors[DAVANTER][2] = 9;
                   com.add ( new ComandoPase ( DAVANTER, EXT_ESQ ) );
                }
            }else{
               com.add ( new ComandoPase ( DAVANTER, INT_DRET ) );
            }
        }

/*
        // davanter ...
        if ( jugadores[LAT_ESQ].getX() < 102 ) {
            if ( jugadores[DAVANTER].getY() < 5 ) {
                //arrayValors[DAVANTER][2] = 9;
                com.add ( new ComandoTiroAPuerta(DAVANTER, -15) );
            }else{
                //arrayValors[DAVANTER][2] = 9;
                com.add ( new ComandoTiroAPuerta(DAVANTER, +5) );
            }
        }else{
            if ( jugadores[DAVANTER].getY() < 0 ) {
                //arrayValors[DAVANTER][2] = 9;
                com.add ( new ComandoPase ( DAVANTER, EXT_DRET ) );
            }else{
                //arrayValors[DAVANTER][2] = 9;
               com.add ( new ComandoPase ( DAVANTER, EXT_ESQ ) );
            }
        }
*/
    }

}
